#include "Key.h"
#include "stm32f10x.h"
#include "FreeRTOS.h"

void Key_Init(void) {
    //---------------------------初始化断网按钮------------------------//
    // 1.开启GPIOA的外设时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    // 2.初始化Pin引脚, 设置为输入或者输出模式
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 初始化Pin引脚
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; // 引脚设置输入输出模式
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

    /*EXTI初始化*/
    EXTI_InitTypeDef EXTI_InitStructure;						//定义结构体变量
    EXTI_InitStructure.EXTI_Line = EXTI_Line0 ;		//选择配置外部中断的0
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;		//指定外部中断线为下降沿触发
    EXTI_Init(&EXTI_InitStructure);								//将结构体变量交给EXTI_Init，配置EXTI外设

    /*NVIC配置*/
    NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//选择配置NVIC的EXTI0线
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//指定NVIC线路的抢占优先级为2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//指定NVIC线路的响应优先级为0
    NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init，配置NVIC外设
    //---------------------------初始化断网按钮------------------------//


    //---------------------------初始化长按复位按钮------------------------//
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB, ENABLE);

    // 按钮引脚(PA11)直接接负极
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  // 内部上拉
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource13);

    EXTI_InitStructure.EXTI_Line = EXTI_Line12;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 双边沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 12;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    //---------------------------初始化长按复位按钮------------------------//

}

//// 在中断服务函数中启动防抖定时器
//void EXTI15_10_IRQHandler(void) {
//    BaseType_t xHigherPriorityTaskWoken = pdFALSE;
//    
//    if(EXTI_GetITStatus(EXTI_Line12) != RESET) {
//        // 启动防抖定时器（10ms）
//        xTimerStartFromISR(xDebounceTimer, &xHigherPriorityTaskWoken);
//        
//        EXTI_ClearITPendingBit(EXTI_Line12);
//    }
//    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
//}

//// 防抖定时器回调函数
//void vDebounceCallback(TimerHandle_t xTimer) {
//    static uint8_t lastState = 0;
//    uint8_t currentState = BUTTON_PRESSED();
//    
//    // 状态变化时处理
//    if(currentState != lastState) {
//        lastState = currentState;
//        
//        if(currentState) {
//            // 按钮按下处理
//            xTimerStart(xLongPressTimer, 0);
//        } else {
//            // 按钮释放处理
//            xTimerStop(xLongPressTimer, 0);
//        }
//    }
//}




